package banco.estoque;

import excecoes.pessoa.CpfCnpjExistenteException;
import excecoes.pessoa.LocalizacaoInvalidaException;
import java.sql.PreparedStatement;
import excecoes.estoque.DinheiroNegativoException;
import excecoes.estoque.NenhumProdutoEncontradoException;
import excecoes.estoque.QuantidadeNegativaException;
import excecoes.pessoa.CpfCnpjInvalidoException;
import excecoes.pessoa.NomeInvalidoException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import banco.Conexao;
import banco.pessoa.BancoCliente;
import smartMarket.estoque.Produto;
import smartMarket.fiscal.Venda;

public class BancoVenda extends Conexao {

    // Construtor
    public BancoVenda() {
        super();
    }

    // Métodos
//    public void excluir(Venda sell) throws SQLException {
//        PreparedStatement sst = conexao.prepareStatement("Delete from Vendas where codigo = ?");
//        sst.setInt(1, sell.getNumero());
//        sst.execute();
//        sst.close();
//        sst = null;
//
//        sst = conexao.prepareStatement("Delete from Vendasprodutos where codigoVenda = ?");
//        sst.setInt(1, sell.getNumero());
//        sst.execute();
//        sst.close();
//        JOptionPane.showMessageDialog(null, "Venda Excluida com sucesso");
//
//    }

    public void novo(Venda buy) throws SQLException {
        PreparedStatement st = conexao.prepareStatement("insert into vendas(valorTotal, vendedor,cliente, desconto, data) "
                + "values (?,?,?,?,?)");
        st.setFloat(1, buy.getValorTotal());
        st.setInt(2, buy.getVendedor().getCodigo());
        st.setInt(3, buy.getCliente().getCodigo());
        st.setFloat(4, buy.getDesconto());
        st.setString(5, buy.getData());
        st.execute();
        st.close();

        BancoProduto bp = new BancoProduto();
        Produto produto;
        Vector<Integer> quantidade = buy.getQuantidade();
        Vector<Integer> produtos = buy.getCodigo();
        for (int i = 0; i < produtos.size(); i++) {
            PreparedStatement sst = conexao.prepareStatement("insert into vendasprodutos(codigoVenda,produto,quantidade)"
                    + "values(?,?,?)");
            sst.setInt(1, ultimaVenda());
            sst.setInt(2, produtos.get(i));
            sst.setInt(3, quantidade.get(i));
            sst.execute();
            sst.close();
            try {
                // Retira a quantidade do banco produto
                produto = bp.buscar(produtos.get(i));
                produto.setQuantidade(produto.getQuantidade() - quantidade.get(i));
                bp.alterar(produto);
                
            } catch (DinheiroNegativoException ex) {
                Logger.getLogger(BancoVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NumberFormatException ex) {
                Logger.getLogger(BancoVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (QuantidadeNegativaException ex) {
                Logger.getLogger(BancoVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NenhumProdutoEncontradoException ex) {
                Logger.getLogger(BancoVenda.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
        JOptionPane.showMessageDialog(null, "Venda confirmada com sucesso");
    }

    public int ultimaVenda() throws SQLException {
        PreparedStatement st = conexao.prepareStatement("SELECT MAX(codigo) AS maximo FROM vendas");

        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return 1;
        }
        return rs.getInt("maximo");


    }

    private Venda buscar(int codigo) throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, NenhumProdutoEncontradoException {
        try {
            PreparedStatement st = conexao.prepareStatement("select * from vendas where codigo = ?");
            st.setInt(1, codigo);
            ResultSet rs = st.executeQuery();
            if (!rs.next()) {
                JOptionPane.showMessageDialog(null, "Nenhuma Venda encontrado");
                return null;
            }
            
            return retornar(rs);
            
        } catch (DinheiroNegativoException ex) {
            Logger.getLogger(BancoVenda.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (NumberFormatException ex) {
            Logger.getLogger(BancoVenda.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (QuantidadeNegativaException ex) {
            Logger.getLogger(BancoVenda.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    private Venda retornar(ResultSet rs) throws SQLException, DinheiroNegativoException, NumberFormatException, QuantidadeNegativaException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, NenhumProdutoEncontradoException {

        try {
            
            Venda buy = new Venda();
            BancoCliente ban = new BancoCliente();
            buy.setNumero(rs.getInt("codigo"));
            buy.setCliente(ban.buscar(rs.getInt("cliente")));
            buy.setData(rs.getString("data"));
            buy.setDesconto(rs.getFloat("desconto"));
            buy.setTotal(rs.getFloat("valortotal"));
            
            
            return buy;

        } catch (CpfCnpjExistenteException ex) {
            Logger.getLogger(BancoVenda.class.getName()).log(Level.SEVERE, null, ex);
        } catch (LocalizacaoInvalidaException ex) {
            Logger.getLogger(BancoVenda.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;

    }

//    public void alterar(Venda buy) throws SQLException {
//        Vector<Integer> quantidade = buy.getQuantidade();
//        Vector<Integer> produtos = buy.getCodigo();
//        PreparedStatement st = conexao.prepareStatement("update Vendas set valortotal = ?, parcelas = ?, "
//                + " cliente = ?, valorPago = ?, valoraberto = ?, formadepagamento = ? where codigo = ?");
//        st.setFloat(1, buy.getValorTotal());
//        st.setInt(2, buy.getParcelas());
//        st.setInt(3, buy.getCliente().getCodigo());
//        st.setFloat(4, buy.getValorPago());
//        st.setFloat(5, buy.getValorAberto());
//        st.setInt(6, buy.getNumero());
//        st.setInt(7, buy.getFormaDePagamento());
//        st.execute();
//        for (int i = 0; i < produtos.size(); i++) {
//            PreparedStatement sst = conexao.prepareStatement("update VendasProdutos set produto = ?,quantidade = ? where codigovenda = ?");
//            sst.setInt(1, produtos.get(i));
//            sst.setInt(2, quantidade.get(i));
//            sst.setInt(4, buy.getNumero());
//            sst.execute();
//            sst.close();
//        }
//        JOptionPane.showMessageDialog(null, "Alterado com sucesso");
//    }

    public Vector<Venda> listar() throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, NenhumProdutoEncontradoException {
        Vector<Venda> Vendas = new Vector<Venda>();
        PreparedStatement ps = conexao.prepareStatement("select * from vendas");
        ResultSet rs = ps.executeQuery();
        if (!rs.next()) {
            JOptionPane.showMessageDialog(null, "Nenhuma venda realizada");
            return null;
        } else {
            Vendas.add(buscar(rs.getInt("codigo")));
            while (rs.next()) {
                Vendas.add(buscar(rs.getInt("codigo")));
            }
        }
        return Vendas;
    }
}
